#include <iostream>
using namespace std;

const int MAX = 20;
enum ErrCode{noErr,overflow};

class set{
private:
    char element[MAX];
    int num;

public:
    set(){num=0;}
    
    /**
     * @brief 成员查询
     * 
     * @param x 
     * @return true 
     * @return false 
     */
    bool Member(char x){
        for(int i=0;i<num;i++)
            if(element[i]==x)
                return true;
        return false;
    }

    ErrCode AddElem(char ch)
    {
        for(int i=0;i<num;i++)
        {
            if(element[i]==ch)
                return noErr;
        }   
        if(num<MAX)
        {
            element[num++]=ch;
            return noErr;
        }
        //集合中已经有elem,不再重复加入
        else
            return overflow;
    }

    void RemoveElem(char ch)
    {
        for(int i=0;i<num;i++)
        {
            if(element[i]==ch)
            {
                for(int j=i;j<num-1;j++)
                    element[j]=element[j+1];
                num--;
            }
        }
    }

    void Copy(set& s)
    {
        for(int i=0;i<num;i++)
            s.element[i]=element[i];
        s.num=num;
    }

    bool Equal(set s)
    {
        if(num!=s.num)
            return false;
        for(int i=0;i<num;i++)
            if(element[i]!=s.element[i])
                return false;
        return true;
    }


    void Print()
    {
        for(int i=0;i<num;i++)
            cout<<element[i]<<" ";
        cout<<endl;
    }

    /**
     * @brief 交集
     * 
     * @param s1 集合1
     * @param s2 输出的集合
     */
    void Intersect(set& s1,set& s2)
    {
        s2.num=0;
        for(int i=0;i<num;i++)
        {
            for(int j=0;j<s1.num;j++)
            {
                if(element[i]==s1.element[j])
                {
                    s2.element[s2.num++]=element[i];
                    break;
                }
            }
            
        }
    }

    ErrCode Union(set& s1,set& s2)
    {
        int i;
        s1.Copy(s2);
        for(int i=0;i<num;i++)
        {
            if(s2.AddElem(element[i])==overflow)
                return overflow;
        }
        return noErr;
    }

    bool Contain(set s)
    {
        int i;
        for(int i=0;i<s.num;i++)
        {
            if(!Member(s.element[i]))
                return false;
        }
        return true;
    }
};





int main(int argc, char const *argv[])
{
    char ch[30]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N',
    'O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d'};

    set s,s1,s2,s3,s4;
    ErrCode b;
    for(int i=0;i<10;i++)
    {
        b=s.AddElem(ch[i]);
        b=s1.AddElem(ch[2*i]);
        b=s2.AddElem(ch[3*i]);
    }
    cout<<"s:";
    s.Print();
    cout<<"s1:";
    s1.Print();
    cout<<"s2:";
    s2.Print();

    //成员查询
    cout<<s.Member('A')<<endl;

    //交并集
    s.Intersect(s1, s3);
    cout<<"s3:";
    s3.Print();
    b=s.Union(s1, s4);
    cout<<"s4:";
    s4.Print();

    //集合逻辑判断
    if(s3.Contain(s4))  
        cout<<"Set s3 contains s4"<<endl;
    if(s4.Contain(s3))
        cout<<"Set s4 contains s3"<<endl;
    if(s4.Equal(s3))
        cout<<"Set s4 Equal s3"<<endl;
    else
        cout<<"Set s4 not Equal s3"<<endl;

    //集合元素删除
    for(int i=6;i<10;i++)
    {
        s.RemoveElem(ch[i]);
        s1.RemoveElem(ch[2*i]);
        s2.RemoveElem(ch[3*i]);
    }
    cout<<"s:";
    s.Print();
    cout<<"s1:";
    s1.Print();
    cout<<"s2:";
    s2.Print();

    return 0;
}